# 资金计划文件名：项目简称（不带“临朐”，带“项目”）-资金计划-2024年10月.xlsx，比如：实训中心项目-资金计划-2024年10月.xlsx
# 资金计划明细表名称：项目明细表
# 结算支付台账文件名：项目简称（不带“临朐”，带“项目”）-结算支付台账-2024年10月.xlsx，比如：实训中心项目-结算支付台账-2024年10月.xlsx
# 结算支付台账汇总表名称：汇总表

# 核对台账和计划表头是否一致
# 核对往来单位名称是否唯一

from pathlib import Path
from openpyxl import load_workbook, cell

from sys import path
path.append('d:/python&work')
from little_function import convert, read

def ergodic_row(ws, row):
    # 暂时停止使用，因为单元格 W3 的 coordinate 属性为 None，导致 AttributeError: 'NoneType' object has no attribute 'coordinate'
    row_info = []
    for the_cell in row:  
        if isinstance(the_cell, cell.MergedCell):
            # 如果是合并的单元格，则使用合并区域的起始单元格的column_letter  
            start_cell = the_cell.coordinate  # 获取合并区域的起始坐标
            print(start_cell)
            column_letter = start_cell[0]
            value = ws[start_cell].value  # MergedCell的value是合并区域中左上角单元格的值  
        else:  
            # 如果是普通的单元格  
            column_letter = the_cell.column_letter  
            value = the_cell.value
        row_info.append((column_letter, value))
        
def fill_in_funding_plan(plan_path, ledger_content, progromme_name, sheet_name='项目明细表'):
    print(f'正在处理文件 {plan_path}')
    wb = load_workbook(plan_path)
    ws = wb[sheet_name]
    # 第三行是表头
    # headers_info = ergodic_row(ws, ws[3])    # 读取表头的信息
    # ergodic_row 函数是为了解决 AttributeError: 'MergedCell' object has no attribute 'column_letter'
    headers_info = [(cell.column, cell.value) for cell in ws[3]]
    # 删除需要更新的部分
    need_change_columns = ['支付方式', '结算金额（不含税）', '结算税金', '质量保证金', '民工工资保证金', '已付结算款', '一年期付款合计', '本月预计结算']
    for the_cell in ws['A']:        # 探索明细表中有多少行明细
        if the_cell.value == '合计':
            last_content_row = the_cell.row - 1
            break
    for col_name in need_change_columns:
        try:
            col_index = [t[0] for t in headers_info if t[1] == col_name][0]
        except:
            print(f'{progromme_name} 资金计划 {col_name} 此列需清空，未找到该列')
            continue
        for row_index in range(5, last_content_row + 1):
            ws.cell(row=row_index, column=col_index).value = None
    # 开始填充值
    need_change_columns.remove('支付方式')        # 剔除需要手动填充的列
    need_change_columns.remove('本月预计结算')
    for row_index in range(5, last_content_row + 1):
        for col_name in need_change_columns:
            col_index = [t[0] for t in headers_info if t[1] == col_name][0]
            unit_col = [t[0] for t in headers_info if t[1] == '往来单位名称'][0]
            the_cell = ws.cell(row=row_index, column=unit_col)
            unit_name = the_cell.value
            if unit_name == None:
                print(f'{progromme_name} 资金计划中往来单位单元格 {the_cell.coordinate} 为空，跳过')
                break
            elif unit_name not in ledger_content:
                print(f'{progromme_name} 资金计划中的 {unit_name} 未在结算支付台账中找到，请检查！')
                break
            ws.cell(row_index, col_index).value = convert.convert_to_wan(ledger_content[unit_name][col_name])
        else:
            ledger_content.pop(unit_name)
    if ledger_content:
        for unit_name in ledger_content:
            print(f'{progromme_name} 中的 {unit_name} 在资金计划中没有，请检查！')

    wb.save(plan_path)

root_path = Path(r'd:/10月')

ledger_root = root_path / '结算支付台账'
ledger_files = read.get_files(ledger_root)

funding_plan_root = root_path / '资金计划'
funding_plan_files = read.get_files(funding_plan_root)
for progromme_name, funding_plan_file in funding_plan_files.items():
    ledger_file = ledger_files[progromme_name]
    ledger_content = read.read_ledger(ledger_file)       # 从结算支付台账中提取数据

    # 本地读取ledger_content
    # with open(root_path / f'{programme_name}_ledger_content.json', 'r', encoding='utf-8') as f:
    #     ledger_content = json.load(f)

    fill_in_funding_plan(funding_plan_file, ledger_content, progromme_name)
    print(f'{funding_plan_file} 已处理完毕！')
    print('-'*120)



# 程序运行思路：根据资金计划中已有的单位在结算支付台账中查找，如果找到，则将结算支付台账中该单位对应的信息填充到资金计划中
# 因为结算支付台账中信息不全（缺少部门，款项性质，合同条款），否则可以直接将结算支付台账中的信息直接填充到资金计划中

# 文件结构：总文件夹的路径提供给程序，下面有两个子文件夹，分别是：结算支付台账、资金计划
# 往来单位名称不可重复

# 台账：ledger，资金计划：funding_plan